常见问题
什么是持续交付?
持续交付(Continuous delivery,简称CD)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付(CD)可以看作持续集成(CI)的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
单元测试,代码编译,构建镜像,集成测试之间是什么关系?
完成整个产品从开发到线上生产环境所要经历的完整环节。
流水线任务 standard_init_linux.go:207:exec user process caused"no such file or directory"
。
可能是由于复制脚本时行尾自动添加了CRLF的^M字符导致无法正确找到#!/bin/sh或者#!/bin/bash导致。
什么是持续集成?
互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。
持续集成指的是,频繁地(一天多次)将代码集成到主干,它的好处主要有两个。
- 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
- 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。
核心措施是,代码集成到主干之前,必须通过自动化测试,只要有一个测试用例失败,就不能集成。
Maven构建任务使用本地Nexus是如何配置?
- 方案1:pom.xml设置repository信息。
- 方案2:配置多个pom文件,为云平台构建时使用的如上图配置具体nexus repositry url 后mvn命令中指定配置文件构建,如下图所示。
- 方案3:还可以使用系统环境变量传参到pom.xml,具体方法如下。
(1) pom.xml
配置url时使用系统环境变量REPO_URL。
(2) Maven构建任务添加系统环境变量,如下图所示。
点击环境变量后,弹出系统环境变量设置界面。保存后执行构建任务,会根据系统环境变量值运行构建。
Gogs代码仓库如何支持CI触发
问题:Devops-代码仓库,绑定Gogs的代码仓库,设置CI触发,没有成功。
Delivery:Posthttps://192.168.1.76:443/api/v2/devops/managed-projects/webhooks
/MPID-Sk-fpUFv8: x509: cannot validate certificate for 192.168.1.76 because
it doesn't contain any IP SANs
gogs本身无法发送webhook到非公认https认证服务导致,https://github.com/gogs/gogs /issues/3672
。
Gogs目前不允许私有证书的insecure设置,需要DevOps的外部地址需要使用http协议。解决方案如下所示。
(1) 按照图中所示的查看对应的参数。
(2) 手动添加对应的参数,如下图所示。
(3) 替换协议地址。
https://192.168.1.76:443/api/v2/devops/managed-projects/webhooks/MPID-Sk-fpUFv8
=>https://192.168.1.76:443
替换为 http 协议可访问的地址。
例如:http://192.168.1.76/api/v2/devops/managed-projects/webhooks/MPID-Sk-fpUFv8
(4) 查询对应的 webhook
,并修改地址,如下图所示。
(5) 修改HTTP地址,如下图所示。
(6) 流水线配置CI触发。
(7) 提交Gogs代码,即可查看流水线被CI触发。
Git Submodule代码源配置说明
- 使用场景
研发的代码项目中包含子模块(submodule), 作为公用模块 git submodule
模式提高了重用率,降低了维护成本。
在多个项目中被共同使用的模块独立维护为一个项目,只在一个代码源项目中维护,被其他项目中以子模块形式使用。
流水线构建中,拉取代码源时如果代码源中有 git submodule
, 则会拉取 submodule 的代码,并进行编译、构建等。
- 前提条件
GitLab代码源中,需要在代码的根目录中配置 .gitsubmodules
文件,并对子模块进行声明。声明属性如下例所示:#cat .gitsubmodules
。
[submodule "apm-protocol/apm-network/src/main/proto"]
path = apm-protocol/apm-network/src/main/proto
url = git@gitlab.tenxcloud.com:distributed-tracing/skywalking-data-collect-protocol.git
branch = master
配置文件说明如下所示。
- Submodule后面引号中使用的为Submodule名称。
- path:为Submodule的相对路径。
- url:为submodule 代码源地址。
- branch:为submodule的代码源分支。如果没有声明,会使用默认分支。
流水线如何编译代码项目
Git Submodule
为公开代码源时
与没有Git Submodule的代码项目一样,流水线任务的脚本中直接编写编译、构建命令行即可。如下图所示。
- Git Submodule为私有代码源时
执行上面命令时因没有submodule的权限会出现 “The project you were looking for could not be found”
的错误提示,需要允许主干代码项目的 deploy key
允许下载 Git Submodule
的代码,进行如下配置。
(1) 引入 git submodule
的代码源也设为私有项目。
(2) 平台CI/CD代码仓库激活活引入 git submodule
的代码源时以 deploy token
方式激活。
(3) .gitsubmodules
配置文件中的URL修改为SSH形式,即 git@xxxx.com:grou pname/projectname.git
形式。
(4) git submodule
代码管理员进入 gitlab
页面,将引入 git submodule
项目的 ssh deploy token
设置为允许。
最终该项目的 enabled deploy keys
中展示对允许的 deploy keys
的来源,如下图所示。
流水线任务的脚本中直接编写编译、构建命令行即可。
流水线如何配置制品
制品必须在/app目录下提取。
PAAS全局配置了FTP。
(1) 在/app目录下提取。
(2) 使用存储卷去提取(因为与镜像构建阶段交互需要共享存储)。
(3) 添加一个挂载设置,选择依赖服务容器,只读权限,挂载路径一致。
平台对接Jenkins的前提条件是什么
(1) 安全设置:点击系统管理界面的Configure Global Security。
a. 访问控制项的安全域设置为Jenkins专有用户数据库。
b. 授权策略设置为登录用户可以做任何事。
c. 防止跨站点请求伪造,选中Default Crumb Issuer。
(1) 系统环境设置静默等待为0(System Configuration),将Jenkins界面/管理Jenkins/系统配置/配置系统,设置静默期为0。
如何搭建GitLab
(1) k8s pod方式:GitLab容器正常运行约需3GB内存,推荐运行在PaaS平台(确认集群资源充足)。
PaaS平台运行配置(集群需配置存储CEPH或NFS或本地存储绑定节点)。
- 在PaaS平台创建2个存储卷
git-data=1GB
、git-conf=512MB
。 - 以Gitlab镜像创建应用,配置如下:3072-3072 MB内存,0.2–2CPU,分别关联两个存储卷到
/etc/gitlab
和/var/opt/gitlab
。
新建一个环境变量:键 GITLAB_OMNIBUS_CONFIG
,值(一行):external_url 'http://<改为服务出口IP>:19980/'; gitlab_rails['initial_root_password'] = 'tenxcloud'; gitlab_rails['gitlab_shell_ssh_port'] = 19922
。
服务出口端口改为指定,内部19980对应外部19980,内部22对应外部19922,并删除443端口。
(2) docker容器方式
- 使用
demo-images/gitlab-ce--8.15.3-ce.0.tar.gz
,同目录还有11版本镜像,优先使用8.15版本。 - 在安装有Docker的独立主机,载入镜像。
docker load -i gitlab-ce--8.15.3-ce.0.tar.gz
。- 规划GitLab访问HTTP使用19980端口,SSH使用19922端口。
- 运行主机创建目录
/opt/gitlab
,需要修改的加粗显示,启动容器。
hostip=<所在主机IP>
docker run -d --restart=always --name=gitlab\
--hostname $hostip -p 19980:19980 -p 19922:22\
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://$hostip:19980/'; \
gitlab_rails['initial_root_password'] = 'tenxcloud'; \
gitlab_rails['gitlab_shell_ssh_port'] = 19922;" \
-v /opt/gitlab/config/:/etc/gitlab/ \
-v /opt/gitlab/logs/:/var/log/gitlab \
-v /opt/gitlab/data/:/var/opt/gitlab \
gitlab-ce:8.15.3-ce.0
GitLab容器启动后,使用用户名 root
,密码 tenxcloud
,登录 http://<ip>``````:19980/
。
(3) 平台应用模板方式部署
externalUrl: 'http://git.com/'
httpPort: 80
httpsPort: 443
image: 'gitlab/gitlab-ce:10.8.7-ce.0'
imagePullPolicy: IfNotPresent
ingress:
annotations: null
enabled: false
tls: null
url: gitlab.cluster.local
livenessPort: http
persistence:
gitlabData:
accessMode: ReadWriteOnce
enabled: true
size: 10Gi
storageClass: kingdee-paas
gitlabEtc:
accessMode: ReadWriteOnce
enabled: true
size: 1Gi
storageClass: kingdee-paas
postgresql:
cpu: 1000m
image: postgres
imageTag: '9.6'
memory: 1Gi
metrics:
enabled: false
image: wrouesnel/postgres_exporter
imagePullPolicy: IfNotPresent
imageTag: v0.1.1
resources:
requests:
cpu: 100m
memory: 256Mi
networkPolicy:
allowExternal: true
enabled: false
persistence:
accessMode: ReadWriteOnce
enabled: true
size: 10Gi
storageClass: kingdee-paas
subPath: postgresql-db
postgresDatabase: gitlab
postgresPassword: gitlab
postgresUser: gitlab
resources:
requests:
cpu: 100m
memory: 256Mi
service:
port: 5432
type: ClusterIP
publicChart: true
readinessPort: http
redis:
image: 'bitnami/redis:3.2.9-r2'
imagePullPolicy: IfNotPresent
metrics:
annotations:
prometheus.io/port: '9121'
prometheus.io/scrape: 'true'
enabled: false
image: oliver006/redis_exporter
imagePullPolicy: IfNotPresent
imageTag: v0.11
persistence:
accessMode: ReadWriteOnce
enabled: true
size: 10Gi
storageClass: kingdee-paas
redisPassword: gitlab
resources:
requests:
cpu: 100m
memory: 1Gi
usePassword: true
resources:
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
serviceType: NodePort
sshPort: 22
参考:如何获取不同版本GitLab的token填入到TCE的代码仓库关联。
- GitLab 8版本:登录后右上角点击账号名,
Profile Settings
,上方Account
,复制Private token
。 - GitLab 10版本:登录后右上角点击账号名,
Settings
,左侧Access Tokens
,输入Names
、过期时间Expires at
和Scopes
全选,复制生成的Personal Access Tokens
。 - GitLab 10以上版本:管理员登录后,上方点击扳手图标Adminarea,左侧Settings,右侧找到
Outbound requests
,勾选“Allow requests to the local network from hooks and services”
并保存。该选项默认是取消状态,会影响流水线中项目的激活操作。